package cn.mujiankeji.mbrowser.app

import android.Manifest // 权限常量
import android.app.Activity
import android.content.pm.PackageManager // 权限检查
import android.os.Build // 版本检查
import android.os.Bundle
import android.util.Log
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts // 权限请求Launcher
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.core.app.NavUtils
import androidx.core.content.ContextCompat // 权限检查辅助
import cn.mujiankeji.mbrowser.ui.theme.Mbrowser4Theme
import cn.mujiankeji.mbrowser.数据.枚举类.主题颜色枚举
import cn.mujiankeji.mbrowser.数据.配置项.应用配置
import cn.mujiankeji.mbrowser.界面.框架.界面实现
import com.blankj.utilcode.util.BarUtils
import com.blankj.utilcode.util.ColorUtils
import io.github.vinceglb.filekit.FileKit
import io.github.vinceglb.filekit.dialogs.init
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.compose.koinInject
import android.app.PictureInPictureParams
import android.app.PictureInPictureUiState
import android.content.res.Configuration
import android.util.Rational
import cn.mujiankeji.mbrowser.工具.mlog
import com.blankj.utilcode.util.ScreenUtils

class MainActivity : ComponentActivity() {

    private val TAG = "MainActivity"

    // 注册权限请求回调
    private val requestPermissionLauncher =
        registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
            if (isGranted) {
                Log.i(TAG, "通知权限已授予")
                // 权限已授予，可以执行相关操作或初始化依赖通知的功能
            } else {
                Log.w(TAG, "通知权限被拒绝")
                // 权限被拒绝。可以向用户显示一个解释，说明为什么需要此权限，
                // 或者禁用依赖此权限的功能。
                // 例如：Toast.makeText(this, "通知权限被拒绝，下载通知可能无法正常显示。", android.widget.Toast.LENGTH_LONG).show()
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        MBrowserApp.init(this)
        checkAndRequestNotificationPermission() // 在onCreate中检查并请求权限
        setContent {
            LaunchedEffect(Unit) {
                初始化管理.初始化应用()
            }
            Mbrowser4Theme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize()
                ) {
                    界面实现()
                }
            }
            匹配状态栏颜色()
            一些听众()
        }


    }

    @Composable
    fun 一些听众(){
        // 全屏模式
        LaunchedEffect(Unit) {
            应用配置.是否全屏模式().collect{
                if (it){
                    ScreenUtils.setFullScreen(this@MainActivity)
                }
                else{
                    ScreenUtils.setNonFullScreen(this@MainActivity)
                }
            }
        }


    }



    @Composable
    private fun 匹配状态栏颜色(viewModel : 界面模块 = koinInject<界面模块>()){
        LaunchedEffect(viewModel.当前标签页) {
            viewModel.当前标签页?.let {
                it.后退()
            }
        }

        val 主题颜色 = 应用配置.读取主题颜色().collectAsState(主题颜色枚举.跟随系统).value
        val isDarkTheme = if (主题颜色 == 主题颜色枚举.跟随系统) isSystemInDarkTheme()
        else 主题颜色 == 主题颜色枚举.深色

        BarUtils.transparentStatusBar(this)
        BarUtils.setStatusBarLightMode(this, !isDarkTheme)
        BarUtils.setNavBarLightMode(this,!isDarkTheme)



    }

    override fun onDestroy() {
        super.onDestroy()

        // Activity销毁时执行的清理工作
        Log.i(TAG, "MainActivity销毁")

        // 注意：不在这里处理WebView资源清理
        // WebView资源清理由应用级别(MBrowserApp)在适当时机统一处理
    }

    private fun checkAndRequestNotificationPermission() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { // Android 13 (API 33)
            when {
                ContextCompat.checkSelfPermission(
                    this,
                    Manifest.permission.POST_NOTIFICATIONS
                ) == PackageManager.PERMISSION_GRANTED -> {
                    Log.i(TAG, "通知权限已经授予")
                    // 权限已授予
                }
                shouldShowRequestPermissionRationale(Manifest.permission.POST_NOTIFICATIONS) -> {
                    // 向用户显示一个解释，为什么需要这个权限。
                    // 可以在这里显示一个对话框或Snackbar，然后再发起请求。
                    // 为了简化，我们直接发起请求，但在实际应用中，处理rationale很重要。
                    Log.i(TAG, "应显示请求通知权限的理由，现在直接请求")
                    requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
                }
                else -> {
                    // 直接请求权限
                    Log.i(TAG, "请求通知权限...")
                    requestPermissionLauncher.launch(Manifest.permission.POST_NOTIFICATIONS)
                }
            }
        } else {
            Log.i(TAG, "Android 13以下版本，不需要运行时请求通知权限")
            // Android 13以下版本，通知权限是默认授予的
        }
    }

    // 统一的进入画中画方法，可供外部调用
    fun 进入画中画() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 可根据实际视频宽高比设置
            val params = PictureInPictureParams.Builder()
                .setAspectRatio(Rational(16, 9)) // 16:9
                .build()
            enterPictureInPictureMode(params)
        }
    }

    override fun onPictureInPictureUiStateChanged(pipState: PictureInPictureUiState) {
        super.onPictureInPictureUiStateChanged(pipState)
    }

    /**
     * 这是Android 13（API 33）新增的回调方法。
     * 当用户通过系统手势（比如手势上滑、最近任务列表的PiP按钮等）请求进入画中画模式时，系统会调用此方法。
     * 你可以在这里决定是否允许进入画中画，或者做一些准备工作（比如隐藏UI、暂停动画等）。
     * 返回true表示允许进入画中画，返回false则拦截（不进入PiP）。
     */
    override fun onPictureInPictureRequested(): Boolean {
        return super.onPictureInPictureRequested()
    }

    /**
     * 这是Android 13（API 33）新增的回调方法。
     * 当画中画窗口的UI状态发生变化时（比如用户拖动小窗、调整大小、最小化/最大化等），系统会调用此方法。
     * 你可以在这里感知PiP窗口的UI变化，并做相应的UI适配或逻辑处理。
     */
    override fun onPictureInPictureModeChanged(
        isInPictureInPictureMode: Boolean,
        newConfig: Configuration
    ) {
        super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
        // 这里可以通知你的UI层（如ViewModel或Compose状态）切换UI
        // 例如：隐藏控制栏、暂停动画等
        if (isInPictureInPictureMode) {
            // 进入画中画
            // TODO: 通知UI层进入PiP（如ViewModel、全局状态等）
        } else {
            // 退出画中画
            // TODO: 通知UI层退出PiP
            应用接口.界面模块().画中画关闭事件?.invoke()
        }
    }


    /**
     * 可选：在onUserLeaveHint时自动进入画中画（比如用户按Home键时）
     */
    override fun onUserLeaveHint() {
        super.onUserLeaveHint()
        mlog("onUserLeaveHint","自动进入画中画？")

    }

}


